{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\md78'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Modify working directory accordingly. This step is not necessary because the directory will be specified below. A portion of the code below is adapted from Deep Learning with Python, by Francois Chollet, 2017, Manning Publications.\n",
    "%pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C:\\Users\\md78\\Documents\\Lucia\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'C:\\\\Users\\\\md78\\\\Documents\\\\Lucia'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%cd \"C:\\\\Users\\\\md78\\\\Documents\\\\Lucia\"\n",
    "%pwd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.9.0'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import keras\n",
    "keras.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os, shutil\n",
    "original_dir= \"C:\\\\Users\\\\md78\\\\Documents\\\\Lucia\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# The directory where we will\n",
    "# store our smaller dataset\n",
    "base_dir = \"C:\\\\Users\\\\md78\\\\Documents\\\\Lucia\\\\conv\"\n",
    "os.mkdir(base_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Directories for our training,\n",
    "# validation and test splits\n",
    "train_dir = os.path.join(base_dir, 'train')\n",
    "os.mkdir(train_dir)\n",
    "validation_dir = os.path.join(base_dir, 'validation')\n",
    "os.mkdir(validation_dir)\n",
    "test_dir = os.path.join(base_dir, 'test')\n",
    "os.mkdir(test_dir)\n",
    "\n",
    "\n",
    "# Directory with our training lion pictures\n",
    "train_lions_dir = os.path.join(train_dir, 'LS')\n",
    "os.mkdir(train_lions_dir)\n",
    "\n",
    "# Directory with our training jaguar pictures\n",
    "train_hyenas_dir = os.path.join(train_dir, 'HS1')\n",
    "os.mkdir(train_hyenas_dir)\n",
    "\n",
    "\n",
    "\n",
    "# Directory with our validation lion pictures\n",
    "validation_lions_dir = os.path.join(validation_dir, 'LS')\n",
    "os.mkdir(validation_lions_dir)\n",
    "\n",
    "# Directory with our validation jaguar pictures\n",
    "validation_hyenas_dir = os.path.join(validation_dir, 'HS1')\n",
    "os.mkdir(validation_hyenas_dir)\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "    \n",
    "# Copy first 20 CM images to train_lions_dir\n",
    "fnames = ['LS.{}.bmp'.format(i) for i in range(146)]\n",
    "for fname in fnames:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_lions_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "\n",
    "# Copy next 10 CM images to validation_lions_dir\n",
    "fnames = ['LS.{}.bmp'.format(i) for i in range(146, 195)]\n",
    "for fname in fnames:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_lions_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "    \n",
    "\n",
    "\n",
    "    \n",
    "# Copy first 20 CM images to train_cats_dir\n",
    "fnames = ['HS1.{}.bmp'.format(i) for i in range(60)]\n",
    "for fname in fnames:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(train_hyenas_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "\n",
    "# Copy next 10 CM images to validation_cats_dir\n",
    "fnames = ['HS1.{}.bmp'.format(i) for i in range(60, 80)]\n",
    "for fname in fnames:\n",
    "    src = os.path.join(original_dir, fname)\n",
    "    dst = os.path.join(validation_hyenas_dir, fname)\n",
    "    shutil.copyfile(src, dst)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#MODULE 2: select model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\md78\\Anaconda3\\lib\\site-packages\\keras\\optimizers\\optimizer_v2\\gradient_descent.py:108: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n",
      "  super(SGD, self).__init__(name, **kwargs)\n"
     ]
    }
   ],
   "source": [
    "# VGG19 for transfer learning \n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.vgg19 import VGG19\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = VGG19(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\toutput = Dense(1, activation='sigmoid')(class1)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(lr=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\md78\\Anaconda3\\lib\\site-packages\\keras\\optimizers\\optimizer_v2\\gradient_descent.py:108: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n",
      "  super(SGD, self).__init__(name, **kwargs)\n"
     ]
    }
   ],
   "source": [
    "# Vgg19 for transfer learning with Dropout\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.vgg19 import VGG19\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = VGG19(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(1, activation='sigmoid')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(lr=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "# VGG19 for transfer learning with Dropout and Early Stopping\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.vgg19 import VGG19\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "\n",
    "\n",
    "#es=EarlyStopping(monitor=\"val_loss\", mode=\"min\", verbose=1)\n",
    "es=EarlyStopping(monitor=\"val_accuracy\", mode=\"max\", patience=15, verbose=1)\n",
    "mc=ModelCheckpoint(\"best_model1.h5\", monitor=\"val_accuracy\", mode=\"max\", verbose=1,save_best_only=True)\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = VGG19(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(1, activation='sigmoid')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(learning_rate=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://storage.googleapis.com/tensorflow/keras-applications/resnet/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5\n",
      "94765736/94765736 [==============================] - 1s 0us/step\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\md78\\Anaconda3\\lib\\site-packages\\keras\\optimizers\\optimizer_v2\\gradient_descent.py:108: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n",
      "  super(SGD, self).__init__(name, **kwargs)\n"
     ]
    }
   ],
   "source": [
    "# for transfer learning RESNET50\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "\n",
    "from tensorflow.keras.applications.resnet50 import ResNet50\n",
    "#from keras.applications.resnet50 import ResNet50\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = ResNet50(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\toutput = Dense(1, activation='sigmoid')(class1)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(lr=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\md78\\Anaconda3\\lib\\site-packages\\keras\\optimizers\\optimizer_v2\\gradient_descent.py:108: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n",
      "  super(SGD, self).__init__(name, **kwargs)\n"
     ]
    }
   ],
   "source": [
    "# for transfer learning RESNET50 with Dropout\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.resnet50 import ResNet50\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = ResNet50(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.3)(class1)\n",
    "\toutput = Dense(1, activation='sigmoid')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(lr=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "# for transfer learning RESNET50 with Dropout and Early Stopping\n",
    "\n",
    "import sys\n",
    "from matplotlib import pyplot\n",
    "from tensorflow.keras.applications.resnet50 import ResNet50\n",
    "from keras.models import Model\n",
    "from keras.layers import Dense\n",
    "from keras.layers import Flatten\n",
    "from keras.layers import Dropout\n",
    "from keras.callbacks import ModelCheckpoint, EarlyStopping\n",
    "from keras.optimizers import SGD\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "#es=EarlyStopping(monitor=\"val_loss\", mode=\"min\", verbose=1)\n",
    "es=EarlyStopping(monitor=\"val_accuracy\", mode=\"max\", patience=15, verbose=1)\n",
    "mc=ModelCheckpoint(\"best_model2.h5\", monitor=\"val_accuracy\", mode=\"max\", verbose=1,save_best_only=True)\n",
    "\n",
    "\n",
    "# define cnn model\n",
    "def define_model():\n",
    "\t# load model\n",
    "\tmodel = ResNet50(include_top=False, input_shape=(80, 400, 3))\n",
    "\t# mark loaded layers as not trainable\n",
    "\tfor layer in model.layers:\n",
    "\t\tlayer.trainable = False\n",
    "\t# add new classifier layers\n",
    "\tflat1 = Flatten()(model.layers[-1].output)\n",
    "\tclass1 = Dense(128, activation='relu', kernel_initializer='he_uniform')(flat1)\n",
    "\tdrop=Dropout(0.2)(class1)\n",
    "\toutput = Dense(1, activation='sigmoid')(drop)\n",
    "\t# define new model\n",
    "\tmodel = Model(inputs=model.inputs, outputs=output)\n",
    "\t# compile model\n",
    "\topt = SGD(learning_rate=0.001, momentum=0.9)\n",
    "\tmodel.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])\n",
    "\treturn model\n",
    "\n",
    "# define model\n",
    "model = define_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Select pre-processing standardization according to transfer model\n",
    "\n",
    "from keras.applications.densenet import preprocess_input#DENSENET201\n",
    "from keras.applications.resnet50 import preprocess_input#RESNET50\n",
    "from keras.applications.inception_resnet_v2 import preprocess_input #InceptionResNetV2 \n",
    "from keras.applications.nasnet import preprocess_input #NASNetLarge\n",
    "from keras.applications.inception_v3 import preprocess_input #InceptionV3\n",
    "from keras.applications.vgg19 import preprocess_input #VGG19\n",
    "from keras.applications.vgg16 import preprocess_input #VGG16\n",
    "from keras.applications.imagenet_utils import decode_predictions, preprocess_input#for efficient Net#modify according to model selected\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#MODULE 3: select with or without augmentation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 220 images belonging to 2 classes.\n",
      "Found 67 images belonging to 2 classes.\n"
     ]
    }
   ],
   "source": [
    "#without augmentation\n",
    "from keras.preprocessing.image import ImageDataGenerator\n",
    "\n",
    "# All images will be rescaled by 1./255\n",
    "train_datagen = ImageDataGenerator(rescale=1./255)\n",
    "test_datagen = ImageDataGenerator(rescale=1./255)\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "        # This is the target directory\n",
    "        train_dir,\n",
    "        # All images will be resized to 40x160\n",
    "        target_size=(80, 400),\n",
    "        batch_size=32,\n",
    "        # Since we use binary_crossentropy loss, we need binary labels\n",
    "        class_mode='binary')\n",
    "\n",
    "validation_generator = test_datagen.flow_from_directory(\n",
    "        validation_dir,\n",
    "        target_size=(80, 400),\n",
    "        batch_size=20,\n",
    "        class_mode='binary',\n",
    "        shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Found 206 images belonging to 2 classes.\n",
      "Found 69 images belonging to 2 classes.\n"
     ]
    }
   ],
   "source": [
    "#WITH AUGMENTATION:\n",
    "import tensorflow\n",
    "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n",
    "from tensorflow.keras.applications.resnet50 import preprocess_input#RESNET50\n",
    " #AQUÍ COPIAR DE ARRIBA SEGÚN MODELO\n",
    "\n",
    "#from keras.applications.resnet50 import preprocess_input#for DENSENET\n",
    "#from keras.applications.imagenet_utils import decode_predictions, preprocess_input#for efficient Net#modify according to model selected\n",
    "\n",
    "\n",
    "#Let's train our network using data augmentation and dropout:\n",
    "train_datagen = ImageDataGenerator(\n",
    "    rotation_range=40,\n",
    "    width_shift_range=0.2,\n",
    "    height_shift_range=0.2,\n",
    "    shear_range=0.2,\n",
    "    zoom_range=0.2,\n",
    "    horizontal_flip=True,\n",
    "    preprocessing_function= \\\n",
    "    tensorflow.keras.applications.resnet50.preprocess_input)#OJO!!!!\n",
    "\n",
    "# Note that the validation data should not be augmented!\n",
    "test_datagen = ImageDataGenerator(preprocessing_function= \\\n",
    "    tensorflow.keras.applications.resnet50.preprocess_input)#OJO!!!\n",
    "\n",
    "train_generator = train_datagen.flow_from_directory(\n",
    "        # This is the target directory\n",
    "        train_dir,\n",
    "        # All images will be resized to 150x150\n",
    "        target_size=(80, 400),\n",
    "        batch_size=32,\n",
    "        # Since we use binary_crossentropy loss, we need binary labels\n",
    "        class_mode='binary')#put \"categorical\" si son más de 2 categorías\n",
    "\n",
    "validation_generator = test_datagen.flow_from_directory(\n",
    "        validation_dir,\n",
    "        target_size=(80, 400),\n",
    "        batch_size=20,\n",
    "        class_mode='binary',\n",
    "        shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "#module4: run model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-17-e5cf153fbace>:1: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n",
      "  history = model.fit_generator(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 2.3622 - accuracy: 0.5680 - val_loss: 0.7350 - val_accuracy: 0.5942\n",
      "Epoch 2/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 1.9474 - accuracy: 0.6845 - val_loss: 1.3753 - val_accuracy: 0.4928\n",
      "Epoch 3/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 1.7388 - accuracy: 0.6942 - val_loss: 0.8808 - val_accuracy: 0.5652\n",
      "Epoch 4/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.7218 - accuracy: 0.6748 - val_loss: 1.0025 - val_accuracy: 0.4493\n",
      "Epoch 5/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5525 - accuracy: 0.7039 - val_loss: 1.1201 - val_accuracy: 0.4058\n",
      "Epoch 6/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.5807 - accuracy: 0.7524 - val_loss: 1.0928 - val_accuracy: 0.4203\n",
      "Epoch 7/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5113 - accuracy: 0.7184 - val_loss: 0.9852 - val_accuracy: 0.4348\n",
      "Epoch 8/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4976 - accuracy: 0.7573 - val_loss: 0.9083 - val_accuracy: 0.4783\n",
      "Epoch 9/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5104 - accuracy: 0.7427 - val_loss: 0.7625 - val_accuracy: 0.6232\n",
      "Epoch 10/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4973 - accuracy: 0.7524 - val_loss: 0.8234 - val_accuracy: 0.5507\n",
      "Epoch 11/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4923 - accuracy: 0.7670 - val_loss: 0.8171 - val_accuracy: 0.5507\n",
      "Epoch 12/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4858 - accuracy: 0.7718 - val_loss: 0.8382 - val_accuracy: 0.5362\n",
      "Epoch 13/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5112 - accuracy: 0.7767 - val_loss: 0.7811 - val_accuracy: 0.5652\n",
      "Epoch 14/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4755 - accuracy: 0.7573 - val_loss: 0.7696 - val_accuracy: 0.5652\n",
      "Epoch 15/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5539 - accuracy: 0.7670 - val_loss: 0.8059 - val_accuracy: 0.5217\n",
      "Epoch 16/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4766 - accuracy: 0.7767 - val_loss: 0.8672 - val_accuracy: 0.5217\n",
      "Epoch 17/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4529 - accuracy: 0.7816 - val_loss: 0.8991 - val_accuracy: 0.5072\n",
      "Epoch 18/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4987 - accuracy: 0.7427 - val_loss: 0.7469 - val_accuracy: 0.5507\n",
      "Epoch 19/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5096 - accuracy: 0.7524 - val_loss: 0.6846 - val_accuracy: 0.6667\n",
      "Epoch 20/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.5067 - accuracy: 0.7524 - val_loss: 0.7320 - val_accuracy: 0.5362\n",
      "Epoch 21/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.4616 - accuracy: 0.7913 - val_loss: 0.6930 - val_accuracy: 0.6522\n",
      "Epoch 22/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.4204 - accuracy: 0.8107 - val_loss: 0.6909 - val_accuracy: 0.6232\n",
      "Epoch 23/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4237 - accuracy: 0.7816 - val_loss: 0.6631 - val_accuracy: 0.6667\n",
      "Epoch 24/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4560 - accuracy: 0.7816 - val_loss: 0.7191 - val_accuracy: 0.6087\n",
      "Epoch 25/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5119 - accuracy: 0.7670 - val_loss: 0.7341 - val_accuracy: 0.6087\n",
      "Epoch 26/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4476 - accuracy: 0.7864 - val_loss: 0.6583 - val_accuracy: 0.6812\n",
      "Epoch 27/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4681 - accuracy: 0.7816 - val_loss: 0.6395 - val_accuracy: 0.6957\n",
      "Epoch 28/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4719 - accuracy: 0.7524 - val_loss: 0.6449 - val_accuracy: 0.6812\n",
      "Epoch 29/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4708 - accuracy: 0.7524 - val_loss: 0.6068 - val_accuracy: 0.6957\n",
      "Epoch 30/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4138 - accuracy: 0.8058 - val_loss: 0.6251 - val_accuracy: 0.6812\n",
      "Epoch 31/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4107 - accuracy: 0.8204 - val_loss: 0.6323 - val_accuracy: 0.6667\n",
      "Epoch 32/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3905 - accuracy: 0.8058 - val_loss: 0.6266 - val_accuracy: 0.6812\n",
      "Epoch 33/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4950 - accuracy: 0.7767 - val_loss: 0.6127 - val_accuracy: 0.6812\n",
      "Epoch 34/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3898 - accuracy: 0.8010 - val_loss: 0.5429 - val_accuracy: 0.7536\n",
      "Epoch 35/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4606 - accuracy: 0.7573 - val_loss: 0.5216 - val_accuracy: 0.7681\n",
      "Epoch 36/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5049 - accuracy: 0.7670 - val_loss: 0.6930 - val_accuracy: 0.6087\n",
      "Epoch 37/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5044 - accuracy: 0.7476 - val_loss: 0.6885 - val_accuracy: 0.6232\n",
      "Epoch 38/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4345 - accuracy: 0.8010 - val_loss: 0.6005 - val_accuracy: 0.7101\n",
      "Epoch 39/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4630 - accuracy: 0.7718 - val_loss: 0.6729 - val_accuracy: 0.6377\n",
      "Epoch 40/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4525 - accuracy: 0.7621 - val_loss: 0.6664 - val_accuracy: 0.6377\n",
      "Epoch 41/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4078 - accuracy: 0.8155 - val_loss: 0.6203 - val_accuracy: 0.6812\n",
      "Epoch 42/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3994 - accuracy: 0.8107 - val_loss: 0.6834 - val_accuracy: 0.6232\n",
      "Epoch 43/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4409 - accuracy: 0.7718 - val_loss: 0.6985 - val_accuracy: 0.6232\n",
      "Epoch 44/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4259 - accuracy: 0.8058 - val_loss: 0.6590 - val_accuracy: 0.6377\n",
      "Epoch 45/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4163 - accuracy: 0.8010 - val_loss: 0.7106 - val_accuracy: 0.6232\n",
      "Epoch 46/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4258 - accuracy: 0.8155 - val_loss: 0.7389 - val_accuracy: 0.5797\n",
      "Epoch 47/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3596 - accuracy: 0.8252 - val_loss: 0.6823 - val_accuracy: 0.6522\n",
      "Epoch 48/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4331 - accuracy: 0.7961 - val_loss: 0.7266 - val_accuracy: 0.6232\n",
      "Epoch 49/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3719 - accuracy: 0.8301 - val_loss: 0.7141 - val_accuracy: 0.6232\n",
      "Epoch 50/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3654 - accuracy: 0.8252 - val_loss: 0.7148 - val_accuracy: 0.6377\n",
      "Epoch 51/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3982 - accuracy: 0.8398 - val_loss: 0.7087 - val_accuracy: 0.6377\n",
      "Epoch 52/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4122 - accuracy: 0.8252 - val_loss: 0.6586 - val_accuracy: 0.6957\n",
      "Epoch 53/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4067 - accuracy: 0.8252 - val_loss: 0.6197 - val_accuracy: 0.7246\n",
      "Epoch 54/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4025 - accuracy: 0.8544 - val_loss: 0.6556 - val_accuracy: 0.6667\n",
      "Epoch 55/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3515 - accuracy: 0.8398 - val_loss: 0.6348 - val_accuracy: 0.7101\n",
      "Epoch 56/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4187 - accuracy: 0.8107 - val_loss: 0.6443 - val_accuracy: 0.7246\n",
      "Epoch 57/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4060 - accuracy: 0.8252 - val_loss: 0.5509 - val_accuracy: 0.7246\n",
      "Epoch 58/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.3760 - accuracy: 0.8252 - val_loss: 0.4849 - val_accuracy: 0.7681\n",
      "Epoch 59/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3711 - accuracy: 0.8301 - val_loss: 0.5677 - val_accuracy: 0.7536\n",
      "Epoch 60/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4024 - accuracy: 0.8010 - val_loss: 0.5359 - val_accuracy: 0.7536\n",
      "Epoch 61/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3330 - accuracy: 0.8689 - val_loss: 0.5317 - val_accuracy: 0.7536\n",
      "Epoch 62/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4079 - accuracy: 0.8058 - val_loss: 0.4930 - val_accuracy: 0.7826\n",
      "Epoch 63/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3983 - accuracy: 0.8252 - val_loss: 0.4622 - val_accuracy: 0.8116\n",
      "Epoch 64/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3866 - accuracy: 0.8204 - val_loss: 0.5147 - val_accuracy: 0.7536\n",
      "Epoch 65/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3587 - accuracy: 0.8398 - val_loss: 0.5032 - val_accuracy: 0.7536\n",
      "Epoch 66/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3738 - accuracy: 0.8204 - val_loss: 0.4805 - val_accuracy: 0.7681\n",
      "Epoch 67/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3913 - accuracy: 0.8107 - val_loss: 0.5261 - val_accuracy: 0.7536\n",
      "Epoch 68/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3459 - accuracy: 0.8350 - val_loss: 0.5304 - val_accuracy: 0.7536\n",
      "Epoch 69/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3917 - accuracy: 0.8155 - val_loss: 0.5197 - val_accuracy: 0.7536\n",
      "Epoch 70/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3747 - accuracy: 0.8155 - val_loss: 0.4580 - val_accuracy: 0.7826\n",
      "Epoch 71/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4283 - accuracy: 0.8301 - val_loss: 0.4751 - val_accuracy: 0.7681\n",
      "Epoch 72/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3929 - accuracy: 0.8155 - val_loss: 0.4399 - val_accuracy: 0.8261\n",
      "Epoch 73/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3700 - accuracy: 0.8398 - val_loss: 0.4574 - val_accuracy: 0.8116\n",
      "Epoch 74/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3544 - accuracy: 0.8252 - val_loss: 0.4482 - val_accuracy: 0.8261\n",
      "Epoch 75/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3114 - accuracy: 0.8738 - val_loss: 0.4332 - val_accuracy: 0.8261\n",
      "Epoch 76/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3996 - accuracy: 0.8544 - val_loss: 0.4994 - val_accuracy: 0.7681\n",
      "Epoch 77/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4104 - accuracy: 0.7816 - val_loss: 0.5213 - val_accuracy: 0.7536\n",
      "Epoch 78/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3631 - accuracy: 0.8252 - val_loss: 0.4955 - val_accuracy: 0.7536\n",
      "Epoch 79/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3474 - accuracy: 0.8544 - val_loss: 0.5063 - val_accuracy: 0.7536\n",
      "Epoch 80/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4290 - accuracy: 0.8058 - val_loss: 0.4987 - val_accuracy: 0.7536\n",
      "Epoch 81/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4124 - accuracy: 0.7913 - val_loss: 0.4713 - val_accuracy: 0.8116\n",
      "Epoch 82/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3643 - accuracy: 0.8495 - val_loss: 0.5503 - val_accuracy: 0.7536\n",
      "Epoch 83/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3765 - accuracy: 0.8155 - val_loss: 0.4795 - val_accuracy: 0.8116\n",
      "Epoch 84/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4367 - accuracy: 0.7816 - val_loss: 0.4909 - val_accuracy: 0.7826\n",
      "Epoch 85/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4241 - accuracy: 0.7913 - val_loss: 0.4722 - val_accuracy: 0.7681\n",
      "Epoch 86/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3761 - accuracy: 0.8252 - val_loss: 0.4543 - val_accuracy: 0.7971\n",
      "Epoch 87/100\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3248 - accuracy: 0.8689 - val_loss: 0.4520 - val_accuracy: 0.7971\n",
      "Epoch 88/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3360 - accuracy: 0.8495 - val_loss: 0.4671 - val_accuracy: 0.7971\n",
      "Epoch 89/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.3809 - accuracy: 0.8107 - val_loss: 0.4355 - val_accuracy: 0.7971\n",
      "Epoch 90/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.3530 - accuracy: 0.8350 - val_loss: 0.4923 - val_accuracy: 0.7826\n",
      "Epoch 91/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3637 - accuracy: 0.8350 - val_loss: 0.4884 - val_accuracy: 0.7826\n",
      "Epoch 92/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4072 - accuracy: 0.8155 - val_loss: 0.4842 - val_accuracy: 0.7681\n",
      "Epoch 93/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3710 - accuracy: 0.8301 - val_loss: 0.4843 - val_accuracy: 0.7826\n",
      "Epoch 94/100\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.3437 - accuracy: 0.8155 - val_loss: 0.5121 - val_accuracy: 0.7681\n",
      "Epoch 95/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3832 - accuracy: 0.8204 - val_loss: 0.6377 - val_accuracy: 0.7101\n",
      "Epoch 96/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3977 - accuracy: 0.8301 - val_loss: 0.5624 - val_accuracy: 0.7536\n",
      "Epoch 97/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3573 - accuracy: 0.8204 - val_loss: 0.5694 - val_accuracy: 0.7246\n",
      "Epoch 98/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3538 - accuracy: 0.8398 - val_loss: 0.6599 - val_accuracy: 0.6957\n",
      "Epoch 99/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3536 - accuracy: 0.8398 - val_loss: 0.7362 - val_accuracy: 0.7101\n",
      "Epoch 100/100\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3574 - accuracy: 0.8447 - val_loss: 0.7334 - val_accuracy: 0.7101\n"
     ]
    }
   ],
   "source": [
    "history = model.fit_generator(\n",
    "      train_generator,\n",
    "      steps_per_epoch=7,\n",
    "      epochs=100,\n",
    "      validation_data=validation_generator,\n",
    "      validation_steps=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-34-1cec0bba1f1a>:3: UserWarning: `Model.fit_generator` is deprecated and will be removed in a future version. Please use `Model.fit`, which supports generators.\n",
      "  history = model.fit_generator(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 3.1856 - accuracy: 0.6311\n",
      "Epoch 1: val_accuracy improved from -inf to 0.40580, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 3.1856 - accuracy: 0.6311 - val_loss: 1.9945 - val_accuracy: 0.4058\n",
      "Epoch 2/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 1.3256 - accuracy: 0.6359\n",
      "Epoch 2: val_accuracy did not improve from 0.40580\n",
      "7/7 [==============================] - 13s 2s/step - loss: 1.3256 - accuracy: 0.6359 - val_loss: 1.3997 - val_accuracy: 0.4058\n",
      "Epoch 3/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.8251 - accuracy: 0.6165\n",
      "Epoch 3: val_accuracy improved from 0.40580 to 0.44928, saving model to best_model.h5\n",
      "7/7 [==============================] - 12s 2s/step - loss: 0.8251 - accuracy: 0.6165 - val_loss: 1.0649 - val_accuracy: 0.4493\n",
      "Epoch 4/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.6123 - accuracy: 0.6893\n",
      "Epoch 4: val_accuracy did not improve from 0.44928\n",
      "7/7 [==============================] - 12s 2s/step - loss: 0.6123 - accuracy: 0.6893 - val_loss: 1.1520 - val_accuracy: 0.4203\n",
      "Epoch 5/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.6188 - accuracy: 0.6893\n",
      "Epoch 5: val_accuracy improved from 0.44928 to 0.47826, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.6188 - accuracy: 0.6893 - val_loss: 0.8933 - val_accuracy: 0.4783\n",
      "Epoch 6/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5527 - accuracy: 0.7184\n",
      "Epoch 6: val_accuracy improved from 0.47826 to 0.57971, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5527 - accuracy: 0.7184 - val_loss: 0.7370 - val_accuracy: 0.5797\n",
      "Epoch 7/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5177 - accuracy: 0.7282\n",
      "Epoch 7: val_accuracy did not improve from 0.57971\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5177 - accuracy: 0.7282 - val_loss: 0.7634 - val_accuracy: 0.5797\n",
      "Epoch 8/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4961 - accuracy: 0.7670\n",
      "Epoch 8: val_accuracy improved from 0.57971 to 0.59420, saving model to best_model.h5\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.4961 - accuracy: 0.7670 - val_loss: 0.7485 - val_accuracy: 0.5942\n",
      "Epoch 9/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5639 - accuracy: 0.7087\n",
      "Epoch 9: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.5639 - accuracy: 0.7087 - val_loss: 0.7237 - val_accuracy: 0.5942\n",
      "Epoch 10/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5239 - accuracy: 0.7379\n",
      "Epoch 10: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5239 - accuracy: 0.7379 - val_loss: 0.7673 - val_accuracy: 0.5797\n",
      "Epoch 11/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5218 - accuracy: 0.7233\n",
      "Epoch 11: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5218 - accuracy: 0.7233 - val_loss: 0.8111 - val_accuracy: 0.5797\n",
      "Epoch 12/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5627 - accuracy: 0.7136\n",
      "Epoch 12: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5627 - accuracy: 0.7136 - val_loss: 0.9074 - val_accuracy: 0.5217\n",
      "Epoch 13/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5491 - accuracy: 0.7379\n",
      "Epoch 13: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5491 - accuracy: 0.7379 - val_loss: 0.8558 - val_accuracy: 0.5652\n",
      "Epoch 14/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4818 - accuracy: 0.7282\n",
      "Epoch 14: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4818 - accuracy: 0.7282 - val_loss: 0.6740 - val_accuracy: 0.5942\n",
      "Epoch 15/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4743 - accuracy: 0.7573\n",
      "Epoch 15: val_accuracy did not improve from 0.59420\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4743 - accuracy: 0.7573 - val_loss: 0.7481 - val_accuracy: 0.5652\n",
      "Epoch 16/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5713 - accuracy: 0.7233\n",
      "Epoch 16: val_accuracy improved from 0.59420 to 0.63768, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.5713 - accuracy: 0.7233 - val_loss: 0.6603 - val_accuracy: 0.6377\n",
      "Epoch 17/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4521 - accuracy: 0.7476\n",
      "Epoch 17: val_accuracy did not improve from 0.63768\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4521 - accuracy: 0.7476 - val_loss: 0.6758 - val_accuracy: 0.5942\n",
      "Epoch 18/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4874 - accuracy: 0.7573\n",
      "Epoch 18: val_accuracy did not improve from 0.63768\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4874 - accuracy: 0.7573 - val_loss: 0.6517 - val_accuracy: 0.6232\n",
      "Epoch 19/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4661 - accuracy: 0.7718\n",
      "Epoch 19: val_accuracy improved from 0.63768 to 0.66667, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4661 - accuracy: 0.7718 - val_loss: 0.6082 - val_accuracy: 0.6667\n",
      "Epoch 20/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4733 - accuracy: 0.7767\n",
      "Epoch 20: val_accuracy did not improve from 0.66667\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4733 - accuracy: 0.7767 - val_loss: 0.6248 - val_accuracy: 0.6522\n",
      "Epoch 21/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4731 - accuracy: 0.7913\n",
      "Epoch 21: val_accuracy did not improve from 0.66667\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4731 - accuracy: 0.7913 - val_loss: 0.6133 - val_accuracy: 0.6667\n",
      "Epoch 22/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4668 - accuracy: 0.7476\n",
      "Epoch 22: val_accuracy improved from 0.66667 to 0.68116, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4668 - accuracy: 0.7476 - val_loss: 0.5802 - val_accuracy: 0.6812\n",
      "Epoch 23/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4495 - accuracy: 0.7767\n",
      "Epoch 23: val_accuracy did not improve from 0.68116\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4495 - accuracy: 0.7767 - val_loss: 0.6703 - val_accuracy: 0.6377\n",
      "Epoch 24/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4531 - accuracy: 0.7913\n",
      "Epoch 24: val_accuracy did not improve from 0.68116\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4531 - accuracy: 0.7913 - val_loss: 0.6395 - val_accuracy: 0.6667\n",
      "Epoch 25/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4608 - accuracy: 0.8010\n",
      "Epoch 25: val_accuracy did not improve from 0.68116\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4608 - accuracy: 0.8010 - val_loss: 0.6109 - val_accuracy: 0.6812\n",
      "Epoch 26/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4552 - accuracy: 0.8155\n",
      "Epoch 26: val_accuracy did not improve from 0.68116\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4552 - accuracy: 0.8155 - val_loss: 0.6254 - val_accuracy: 0.6667\n",
      "Epoch 27/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4586 - accuracy: 0.7864\n",
      "Epoch 27: val_accuracy improved from 0.68116 to 0.69565, saving model to best_model.h5\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4586 - accuracy: 0.7864 - val_loss: 0.5667 - val_accuracy: 0.6957\n",
      "Epoch 28/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.5172 - accuracy: 0.7573\n",
      "Epoch 28: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 12s 2s/step - loss: 0.5172 - accuracy: 0.7573 - val_loss: 0.6529 - val_accuracy: 0.6232\n",
      "Epoch 29/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4351 - accuracy: 0.8107\n",
      "Epoch 29: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 12s 2s/step - loss: 0.4351 - accuracy: 0.8107 - val_loss: 0.7524 - val_accuracy: 0.5797\n",
      "Epoch 30/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4135 - accuracy: 0.8252\n",
      "Epoch 30: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4135 - accuracy: 0.8252 - val_loss: 0.8030 - val_accuracy: 0.5942\n",
      "Epoch 31/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4446 - accuracy: 0.7718\n",
      "Epoch 31: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4446 - accuracy: 0.7718 - val_loss: 0.7813 - val_accuracy: 0.5942\n",
      "Epoch 32/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4707 - accuracy: 0.7621\n",
      "Epoch 32: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 12s 2s/step - loss: 0.4707 - accuracy: 0.7621 - val_loss: 0.7782 - val_accuracy: 0.5797\n",
      "Epoch 33/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.3754 - accuracy: 0.8252\n",
      "Epoch 33: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3754 - accuracy: 0.8252 - val_loss: 0.7714 - val_accuracy: 0.5797\n",
      "Epoch 34/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4074 - accuracy: 0.8252\n",
      "Epoch 34: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4074 - accuracy: 0.8252 - val_loss: 0.7341 - val_accuracy: 0.6232\n",
      "Epoch 35/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4050 - accuracy: 0.8398\n",
      "Epoch 35: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 15s 2s/step - loss: 0.4050 - accuracy: 0.8398 - val_loss: 0.7430 - val_accuracy: 0.6232\n",
      "Epoch 36/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.3953 - accuracy: 0.8252\n",
      "Epoch 36: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 14s 2s/step - loss: 0.3953 - accuracy: 0.8252 - val_loss: 0.7125 - val_accuracy: 0.6232\n",
      "Epoch 37/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4213 - accuracy: 0.7961\n",
      "Epoch 37: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4213 - accuracy: 0.7961 - val_loss: 0.7585 - val_accuracy: 0.5942\n",
      "Epoch 38/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.3934 - accuracy: 0.7913\n",
      "Epoch 38: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.3934 - accuracy: 0.7913 - val_loss: 0.6688 - val_accuracy: 0.6812\n",
      "Epoch 39/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4344 - accuracy: 0.8058\n",
      "Epoch 39: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4344 - accuracy: 0.8058 - val_loss: 0.6307 - val_accuracy: 0.6957\n",
      "Epoch 40/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4088 - accuracy: 0.8204\n",
      "Epoch 40: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4088 - accuracy: 0.8204 - val_loss: 0.6100 - val_accuracy: 0.6957\n",
      "Epoch 41/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4341 - accuracy: 0.7913\n",
      "Epoch 41: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4341 - accuracy: 0.7913 - val_loss: 0.6131 - val_accuracy: 0.6957\n",
      "Epoch 42/100\n",
      "7/7 [==============================] - ETA: 0s - loss: 0.4584 - accuracy: 0.7961\n",
      "Epoch 42: val_accuracy did not improve from 0.69565\n",
      "7/7 [==============================] - 13s 2s/step - loss: 0.4584 - accuracy: 0.7961 - val_loss: 0.6431 - val_accuracy: 0.6667\n",
      "Epoch 42: early stopping\n"
     ]
    }
   ],
   "source": [
    "#TO USE WITH EARLY STOPPING\n",
    "\n",
    "history = model.fit_generator(\n",
    "      train_generator,\n",
    "      steps_per_epoch=7,\n",
    "      epochs=100,\n",
    "      validation_data=validation_generator,\n",
    "      validation_steps=4,\n",
    "      callbacks=[es,mc])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "#guardar modelo\n",
    "model_json=model.to_json()\n",
    "with open(\"vgg19_august22_dropout_ES.json\", \"w\") as json_file:\n",
    "    json_file.write(model_json)\n",
    "#serializar los pesos\n",
    "model.save_weights(\"vgg19_august22_dropout_ES.h5\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-36-f968fbb02e8f>:1: UserWarning: `Model.predict_generator` is deprecated and will be removed in a future version. Please use `Model.predict`, which supports generators.\n",
      "  predictions=model.predict_generator(validation_generator, steps=len(validation_generator), verbose=1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4/4 [==============================] - 3s 745ms/step\n"
     ]
    }
   ],
   "source": [
    "predictions=model.predict_generator(validation_generator, steps=len(validation_generator), verbose=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "val_preds = np.round(predictions)# from probabilities to 0 or 1\n",
    "val_trues = validation_generator.classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[19  1]\n",
      " [22 27]]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "mat= confusion_matrix (val_trues,val_preds)\n",
    "print(mat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.46      0.95      0.62        20\n",
      "           1       0.96      0.55      0.70        49\n",
      "\n",
      "    accuracy                           0.67        69\n",
      "   macro avg       0.71      0.75      0.66        69\n",
      "weighted avg       0.82      0.67      0.68        69\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import classification_report\n",
    "print(classification_report(val_trues, val_preds))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7505102040816326"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.metrics import roc_auc_score\n",
    "roc_auc_score(val_trues,val_preds) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAEICAYAAABPgw/pAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA04UlEQVR4nO3deZxT1fn48c8zI/sqixsIA1RBkDLAiDKKoICOy9cVvkIpZeTbKlqLS3ErVayVakXrUu3X0tbiQkXlq/zUIooLQotW0Q4qDFhANhFF0GFf5/n9cZIhE7JNJsm9yTzv1yuvJDc3957czDw595znniOqijHGmOyX53UBjDHGpIYFdGOMyREW0I0xJkdYQDfGmBxhAd0YY3KEBXRjjMkRFtBzmIi8KiJjUr2ul0RktYgMScN2VUS+F3j8mIjclsi6SexnlIi8nmw5jYlFLA/dX0Rke8jTxsAe4EDg+ZWqOj3zpfIPEVkN/FhV30jxdhU4TlVXpGpdESkAPgfqqer+lBTUmBgO87oApjpVbRp8HCt4ichhFiSMX9jfoz9Yk0uWEJFBIrJeRG4WkY3AX0XkcBF5RUQ2ici3gcftQ94zT0R+HHhcKiL/EJH7Aut+LiLnJLluJxGZLyLbROQNEXlURJ6OUu5EyvhrEflnYHuvi0ibkNdHi8gaEdksIhNjHJ9TRGSjiOSHLLtYRD4OPO4nIu+KyHci8qWIPCIi9aNsa5qI3BXy/MbAezaIyNiwdc8TkX+LyFYRWScid4S8PD9w/52IbBeR/sFjG/L+YhH5QEQqAvfFiR6bGh7nViLy18Bn+FZEZoW8dqGIlAU+w0oRKQksr9a8JSJ3BL9nESkIND39j4isBd4KLH8+8D1UBP5GeoS8v5GI3B/4PisCf2ONROTvIvKzsM/zsYhcFOmzmugsoGeXo4BWQEfgCtz399fA8w7ALuCRGO8/GVgOtAHuBf4iIpLEun8D3gdaA3cAo2PsM5Ey/gC4HDgCqA9MABCR7sD/BrZ/TGB/7YlAVd8DdgBnhm33b4HHB4DrA5+nPzAYuDpGuQmUoSRQnqHAcUB4+/0O4EdAS+A84KqQQHR64L6lqjZV1XfDtt0K+DvwcOCz/Q74u4i0DvsMhxybCOId56dwTXg9Att6IFCGfsCTwI2Bz3A6sDrKPiIZCJwAnB14/iruOB0BfASENhHeB/QFinF/xzcBlcATwA+DK4lIL6AdMLsG5TAAqmo3n95w/1hDAo8HAXuBhjHWLwS+DXk+D9dkA1AKrAh5rTGgwFE1WRcXLPYDjUNefxp4OsHPFKmMvwx5fjUwJ/D4dmBGyGtNAsdgSJRt3wU8HnjcDBdsO0ZZ9zrgxZDnCnwv8HgacFfg8ePAPSHrHR+6boTtPgg8EHhcEFj3sJDXS4F/BB6PBt4Pe/+7QGm8Y1OT4wwcjQuch0dY74/B8sb6+ws8vyP4PYd8ts4xytAysE4L3A/OLqBXhPUaAFtw/RLgAv8f0vE/les3q6Fnl02qujv4REQai8gfA6ewW3Gn+C1Dmx3CbAw+UNWdgYdNa7juMcCWkGUA66IVOMEybgx5vDOkTMeEbltVdwCbo+0LVxu/REQaAJcAH6nqmkA5jg80Q2wMlOM3uNp6PNXKAKwJ+3wni8jbgaaOCmBcgtsNbntN2LI1uNppULRjU02c43ws7jv7NsJbjwVWJljeSKqOjYjki8g9gWabrRys6bcJ3BpG2peq7gGeA34oInnASNwZhakhC+jZJTwl6edAV+BkVW3OwVP8aM0oqfAl0EpEGocsOzbG+rUp45eh2w7ss3W0lVV1KS4gnkP15hZwTTfLcLXA5sAvkikD7gwl1N+Al4BjVbUF8FjIduOlkG3ANZGE6gB8kUC5wsU6zutw31nLCO9bB3SJss0duLOzoKMirBP6GX8AXIhrlmqBq8UHy/ANsDvGvp4ARuGawnZqWPOUSYwF9OzWDHca+12gPXZSuncYqPEuAu4Qkfoi0h/4rzSVcSZwvoicFujAvJP4f7N/A8bjAtrzYeXYCmwXkW7AVQmW4TmgVES6B35QwsvfDFf73R1oj/5ByGubcE0dnaNsezZwvIj8QEQOE5HLgO7AKwmWLbwcEY+zqn6Ja9v+Q6DztJ6IBAP+X4DLRWSwiOSJSLvA8QEoA0YE1i8ChiVQhj24s6jGuLOgYBkqcc1XvxORYwK1+f6BsykCAbwSuB+rnSfNAnp2exBohKv9vAfMydB+R+E6Fjfj2q2fxf0jR/IgSZZRVZcAP8UF6S+Bb4H1cd72DK6/4S1V/SZk+QRcsN0G/ClQ5kTK8GrgM7wFrAjch7oauFNEtuHa/J8Lee9OYDLwT3HZNaeEbXszcD6udr0Z10l4fli5E/UgsY/zaGAf7izla1wfAqr6Pq7T9QGgAniHg2cNt+Fq1N8Cv6L6GU8kT+LOkL4AlgbKEWoC8AnwAa7N/LdUj0FPAj1xfTImCXZhkak1EXkWWKaqaT9DMLlLRH4EXKGqp3ldlmxlNXRTYyJykoh0CZyil+DaTWd5XCyTxQLNWVcDU70uSzazgG6ScRQupW47Lof6KlX9t6clMllLRM7G9Td8RfxmHRODNbkYY0yOsBq6McbkCM8G52rTpo0WFBR4tXtjjMlKH3744Teq2jbSa54F9IKCAhYtWuTV7o0xJiuJSPjVxVWsycUYY3KEBXRjjMkRFtCNMSZH+GrGon379rF+/Xp2794df2XjiYYNG9K+fXvq1avndVGMMWF8FdDXr19Ps2bNKCgoIPq8C8YrqsrmzZtZv349nTp18ro4xpgwvmpy2b17N61bt7Zg7lMiQuvWre0MymTM9OlQUAB5ee5+ep2eIj0+X9XQAQvmPmffj8mU6dPhiitgZ2AqlTVr3HOAUaO8K5ef+aqGbowxQRMnHgzmQTt3uuUmMgvoITZv3kxhYSGFhYUcddRRtGvXrur53r17Y7530aJFjB8/Pu4+iouL465jjIG1a2u23GR5QE91+1rr1q0pKyujrKyMcePGcf3111c9r1+/Pvv374/63qKiIh5++OG4+1i4cGHtCmlMHdEhfLK/OMtNFgf0YPvamjWgerB9LdWdJqWlpdxwww2cccYZ3Hzzzbz//vsUFxfTu3dviouLWb58OQDz5s3j/PPPB+COO+5g7NixDBo0iM6dO1cL9E2bNq1af9CgQQwbNoxu3boxatSo4AzozJ49m27dunHaaacxfvz4qu2GWr16NQMGDKBPnz706dOn2g/FvffeS8+ePenVqxe33HILACtWrGDIkCH06tWLPn36sHJlbeYFNib9Jk+Gxo2rL2vc2C03UaiqJ7e+fftquKVLlx6yLJqOHVVdKK9+69gx4U3ENGnSJJ0yZYqOGTNGzzvvPN2/f7+qqlZUVOi+fftUVXXu3Ll6ySWXqKrq22+/reedd17Ve/v376+7d+/WTZs2aatWrXTv3r2qqtqkSZOq9Zs3b67r1q3TAwcO6CmnnKILFizQXbt2afv27XXVqlWqqjpixIiq7YbasWOH7tq1S1VVP/vsMw0ez9mzZ2v//v11x44dqqq6efNmVVXt16+fvvDCC6qqumvXrqrXk1GT78mY2nj6afc/LeLun37a6xJ5D1ikUeJq1tbQM9m+Nnz4cPLz8wGoqKhg+PDhnHjiiVx//fUsWbIk4nvOO+88GjRoQJs2bTjiiCP46quvDlmnX79+tG/fnry8PAoLC1m9ejXLli2jc+fOVXneI0eOjLj9ffv28ZOf/ISePXsyfPhwli5dCsAbb7zB5ZdfTuNA1aZVq1Zs27aNL774gosvvhhwFwc1Dq/6mDovXSmCsbYbb5+jRsHq1VBZ6e5Ds1sspfFQvktbTFSHDq6ZJdLyVGvSpEnV49tuu40zzjiDF198kdWrVzNo0KCI72nQoEHV4/z8/Ijt75HW0QQnHHnggQc48sgjWbx4MZWVlTRs2BBwZ1zhqYWJbtPUXelKEYy1XUh+n5bSGFnW1tC9al+rqKigXbt2AEybNi3l2+/WrRurVq1i9erVADz7bOTJ6SsqKjj66KPJy8vjqaee4sCBAwCcddZZPP744+wM/KVv2bKF5s2b0759e2bNmgXAnj17ql43BtKXIhhru7XZp5cpjX4+M8jagD5qFEydCh07goi7nzo1/b/ON910E7feeiunnnpqVRBNpUaNGvGHP/yBkpISTjvtNI488khatGhxyHpXX301TzzxBKeccgqfffZZ1VlESUkJF1xwAUVFRRQWFnLfffcB8NRTT/Hwww/z/e9/n+LiYjZu3Jjyspvsla4mzFjbrc0+vUppzFQyRtKiNa6n+1bbTtFctm3bNlVVrays1Kuuukp/97vfeVyi6ux7Si8vOgLTlWQQa7u12We6kyL8tt9Q5GKnaC7705/+RGFhIT169KCiooIrr7zS6yKZDPGqBpiuJsxY263NPr1qcvX9xU7RIn26b1ZDz172PaWPlzXAdJ0ZxNpubfaZS2cyNUGMGrqoRxkQRUVFGj6naHl5OSeccIIn5TGJs+8pffLyXIgIJ+JS92pj+nTXabh2rcsGmzy5bmeEJCM8uwbcmUEm+u+CRORDVS2K9Jo1uRjjI+m63N33nXlZwqtkjERZQDfGR9LVNmwjF9ZMrNTEWBc7ec0CujE+kq4aoO8783wkm89mEgroIlIiIstFZIWI3BLh9RYi8rKILBaRJSJyeeqLmn6DBg3itddeq7bswQcf5Oqrr475nmBfwLnnnst33313yDp33HFHVT54NLNmzaq6fB/g9ttv54033qhB6U02yXQN0EYuTFw2n83EDegikg88CpwDdAdGikj3sNV+CixV1V7AIOB+Eamf4rKm3ciRI5kxY0a1ZTNmzIg6nkq42bNn07Jly6T2HR7Q77zzToYMGZLUtoy/eVEDtJELE5fNZzOJ1ND7AStUdZWq7gVmABeGraNAM3GDiDQFtgDRBw/3qWHDhvHKK6+wZ88ewA1Ru2HDBk477TSuuuoqioqK6NGjB5MmTYr4/oKCAr755hsAJk+eTNeuXRkyZEjVELvgcsxPOukkevXqxaWXXsrOnTtZuHAhL730EjfeeCOFhYWsXLmS0tJSZs6cCcCbb75J79696dmzJ2PHjq0qX0FBAZMmTaJPnz707NmTZcuWHVImG2bXf7yoAfq9My8dkr1EP51nM2kfNiBaPmPwBgwD/hzyfDTwSNg6zYC3gS+B7cB5UbZ1BbAIWNShQ4dD8itD85uvvVZ14MDU3q69Nn6O57nnnquzZs1SVdW7775bJ0yYoKoHh6Hdv3+/Dhw4UBcvXqyqqgMHDtQPPvhAVVU7duyomzZt0kWLFumJJ56oO3bs0IqKCu3SpYtOmTJFVVW/+eabqn1NnDhRH374YVVVHTNmjD7//PNVrwWfB4fTXb58uaqqjh49Wh944IGq/QXf/+ijj+r//M//HPJ50jHMruWh145I5FxmEa9Lljueflq1cePqx7dx48Ry1Wvz3kxsl1peKRppVuDwTNmzgTLgGKAQeEREmkf48ZiqqkWqWtS2bdsEdp15oc0uoc0tzz33HH369KF3794sWbKkWvNIuAULFnDxxRfTuHFjmjdvzgUXXFD12qeffsqAAQPo2bMn06dPjzr8btDy5cvp1KkTxx9/PABjxoxh/vz5Va9fcsklAPTt27dqQK9QNsxubF4MGWvt2ekX7ywoXh9GsmczsbabiTOzRIbPXQ8cG/K8PbAhbJ3LgXsCvx4rRORzoBvwfrIFe/DBZN9ZOxdddBE33HADH330Ebt27aJPnz58/vnn3HfffXzwwQccfvjhlJaWsnv37pjbCR/CNqi0tJRZs2bRq1cvpk2bxrx582JuR+Nc+BUcgjfaEL02zG50XgwZO2qUa7eOdHGKtWenTqx28ES+91Gjav43EG+7mWibT6SG/gFwnIh0CnR0jgBeCi8TMBhARI4EugKrUlfMzGnatCmDBg1i7NixVbXzrVu30qRJE1q0aMFXX33Fq6++GnMbp59+Oi+++CK7du1i27ZtvPzyy1Wvbdu2jaOPPpp9+/YxPeTnu1mzZmzbtu2QbXXr1o3Vq1ezYsUKwI2aOHDgwIQ/jw2zG50XQ8ZC3WzPzrRYZ0Fefe+ZODOLG9BVdT9wDfAaUA48p6pLRGSciIwLrPZroFhEPgHeBG5W1W9SV8zMGjlyJIsXL2bEiBEA9OrVi969e9OjRw/Gjh3LqaeeGvP9ffr04bLLLqOwsJBLL72UAQMGVL3261//mpNPPpmhQ4fSrVu3quUjRoxgypQp9O7du1pHZMOGDfnrX//K8OHD6dmzJ3l5eYwbN45E2TC70XkxZGxQsqmJfh6L209iZfV49b1nJNMoWuN6um82OFf2ypXvyYshY2sjXZ11uSra4F1efu+pGFCMGJ2iFtBNjeXK9+T3bIZwfhjpLxdk2/ceLlZAt0v/TZ2VrrZsu3zf37Lte6+RaJE+3bdoNfTKysrU/pyZlKqsrMyqGno6x8zO9HjcVkM3qllUQ2/YsCGbN292bUHGd1SVzZs3V6U++l06L7G3y/eNH/lqgot9+/axfv36uDnexjsNGzakffv21KtXz+uiVIk2cUNBgQu04Tp2dJkltZHObcfi1SQVNjmGf8Sa4MJXAd2Ymoo1g8zo0emb/SedMwv5jR9m6TEH2YxFPmU5xbUX62KOdF7IUZcu38/m4WTrGgvoHsnmQfT9JFbmRzrbnOtSe7Zl12QPC+gesVpPasSqKaczjcwXKWoZUpfORrKdBXSPWK0nNeLVlNM5/6Of55ZMpUTORqz50B8soHvEaj2pUZdqyl6Jd4yt+dA/LKB7JBfbYNNZS8vWWdgzLV3fQaxjbM2HPhLtiqN03yJdKVrXZPpKw3RK5zgWNihVYrw6TjYDU2YR40pRy0M3KZGLF/FkG6+Ok30/mWV56Cbt0tnJax3IifHqOOVi82G2soBuUqK2nbx+nIMz2zI3vDpO1jHtI9HaYtJ9szb03JLOWda9aBvOxnb7bCyzqTmyZYILk92S7eTN1EwvNZGtQ9XmUke7iSxWQLdOUeM5Pw505ccyGQPWKWp8zo8XWfmxTMbEYwE9S3l1EU86+DFLwo9lMiauaG0x6b5ZG3rycvEiHj+2/fqxTMZgbei5xS7iMabusjb0HGMX8RhjIrGAnmbpaI/2ciaebLvYxpi6xAJ6GqVrWFGvZuKxYVKN8blojevpvtWFTtF0XpwSr8OuNh160d5b289jnYzG1B7WKeoNry5OSdcs7bX5PDZzvDGpYZ2iHvHq4pR0TThQm89jkyAYk34W0FMgWkehVxenpCtTpTafx7JnjEk/C+i1FKuj0KthRdN1ZlCbz2OX0huTAdEa19N9y5VOUT+OypfIcLSZ7py0oV2NSQ1idIpaDb2W/NiUEKsm7VXqoU2CYEz6WZZLLaXzUvnp012n4dq1rmli8uTaB0C7tN+Y7GZZLmmUro7PdNWk/XhGYYxJDQvotZSupgQ/ph4aY/zNAnoKjBrlmisqK919KtqF/Zh6aIzxt4QCuoiUiMhyEVkhIrdEeP1GESkL3D4VkQMi0ir1xa07/Jh6aIzxt7gBXUTygUeBc4DuwEgR6R66jqpOUdVCVS0EbgXeUdUtaShvnZHOmnQ6ziiMMd5LpIbeD1ihqqtUdS8wA7gwxvojgWdSUbi6zGrSxpiaOiyBddoB60KerwdOjrSiiDQGSoBrorx+BXAFQAfrhYtr1CgL4MaYxCUS0CXCsmjJ6/8F/DNac4uqTgWmgstDT6iExphqysrghhtg5kxoZT1VabFgAVx7LWzfntz7O3SA557L/PeTSJPLeuDYkOftgQ1R1h1Blja3xJqJx2bpMX6hCj/9Kbz9Nrz5ptelyU0zZ8LQobB1KxQV1fzWp4/7fu66y4PCRxsTIHjD1eJXAZ2A+sBioEeE9VoAW4Am8bapPhvLJdY4IzYGifGT5547+Hd4/fVelyb3PPSQG+Po1FNVN29Ofjs//rFqvXqqn32WurIFUdsJLkTkXOBBIB94XFUni8i4wA/CY4F1SoESVR2RyA+Jny79j3U5PNil8sYfdu+G7t2hWTNo2hQOHID33vO6VLmhshJuuQWmTIGLL3Zn4Y0aJb+9jRvhe9+Ds86CF15IXTkh9qX/NpYLsWfiAW9mHTIm3JQpcNNNMHeuuz3wgGsWaNjQ65Jltz174PLL4Zln4Oqr4eGHIT+/9tudPBl++UuYNw8GDqz99oJsLJc4Yl3EY5fKGz/YtMm1yZ5/PgwZAsXFsG8ffPih1yXLbhUVcO65LpjffTc88khqgjm4jutjj3X3mar8WUAn9kU8dql83bZvH6xbF3+9ZCxf7ppNEnHHHbBjh6ulA/Tv7+4XLkxL0eqEDRvg9NNh/nx48knX5CKRcvqS1KiR+5H46CN4+unUbTemaI3r6b75qVNUNfakDzZbfd20ZYvq6aer1q+vunp16rZ74IDqhAmuY/Pii1V37oy9/pIlqvn5qtdcU315ly7u/SY5I0aoNmmi+vrr6dvHgQOqJ52k2q6d6vbtqdkmMTpFLaAbE8Hatardu7tMBVC9887UbHf3bhdIQHXw4MQyKs49V7VFC9VNm6ovHz1a9cgjVSsrU1O2uqZzZ9X//u/072fBAvd9/+pXqdlerIBuTS7GhPn4YzjlFFi/Hl57Dc44A554InLneE1UVMA558CMGXDPPa5j89ln4YMP4NRTI2dTvf46zJ7tOtfatKn+Wv/+8NVX8PnntStXXVRRAatWQWFh+vd12mkwbBj89reumSedLKAbE+Ltt2HAANeW+o9/uGBeWgorV8I//5n8dr/4wm13wQJ46im4+Wa3j+HDXdDeuNEF6LKyg+85cAB+/nPo1Al+9rNDt1lc7O7ffTf5ctVVH3/s7jMR0MH9gO/f736Y08kCujEBM2bA2We7zIR334WePd3ySy91ed/TpiW33SVLXLBevdrVtn/4w+qvDxzofjzy810n3RtvuOWPPw6ffgr33gsNGhy63RNPdOWyjtGaC/5wZiqgd+kC48e7v6F//zt9+7GAbuo8Vbj/fhg50gXeBQtcUA9q0sTVpJ97zmWa1MT8+e6Ue98+93jo0Mjr9ejhfkQKClyzzB//6Gpzp57qflAiyc+Hk0+2GnoyysrgiCPgqKMyt8+JE93YLj//ee2b76KxgG5ywiuvuCBY03+Uykq4/nqYMMEF7ddeg8MPP3S90lLYtg1efDHxbc+e7QL4UUe5oBuvNti+vfsxGTAAxo2Dr7+G3/0udipdcTEsXpz8IFJ1VVmZ+z5SmaYYT8uW8KtfuWa9l19Ozz4soJust3+/m0B73Dh3v39/Yu/bvRtGjICHHnIj682YEf2qy9NOg86dE2922bHDlaVbN9f2XlCQ2PtatIBXX3VXLE6cCP36xV6/f3/3o/T++4lt37izpU8/zVxzS6grroDvfx8++yw9209k+FxjfG3uXPjySzduxp//7B4/+6xrKonm22/hootcM8j997ur+WLJy4MxY9wFPmvWHBznJ5r773cdoTNm1HwI1QYN4NFHE1v3lFPc/bvvwpln1mw/ddWyZbB3rzcBvV49WLTI3aeD1dBN1ps2DVq3dqexjz3marhnnOGaLCJZt87VuN99113yHS+YB/3oR65J56mnYq+3YYNLURs2zO0nnQ4/HE44wTpGayLTHaLh0hXMwQK6yXLffguzZrmZnerXhyuvdO3cn37qOhRXrqy+/iefuGaKYI75iITGBnUKCmDQIPcDEqut/pe/dM0+99xT88+TjOJiN+qiDRaXmLIyd1n+8cd7XZLUs4BustqMGe70ubT04LILLnCTP3z7rQveH3zglr/99sEaczDHvKbi5aSXlbmAP368S1XLhOJi2LIlfe2yuaaszKWkpmoQLj+xgG6y2rRprpMp/PS5f38XdJs0cbXqW2+FkhKXSRKaY15Tl17qthmpc1TVpaS1auU6NDPFBupKnKoL6L16eV2S9LCAbrLW0qUuu6O0NHL6WdeuLnh37eqaP04+2dXMQ3PMa6pp0+g56a+8Am+95VLTWrZMfh811bWra0u3fPT41q93ZzNetZ+nmwV0k7WeeAIOO8y1n0dz1FHwzjuuI/P11yPnmNdUpJz0fftcLnvXri41LZPy8ly2i9XQ4/O6QzTdLKCbrLR/vwvS557rrviLpVkzd7l9qmb2GTDAja8S2uzy2GOuDfu++9KbxRBNcbE7Y/nuu8zvO5uUlbmzuWSb3PzOArrJSsHc89DO0EwJ5qS/9ZbLSf/2W5efPngwnHde5ssDBwfqsjlGYysrc3N9NmvmdUnSwwK6yUrB3HOvAmhoTvpdd7mgfv/9mb2UPFS/fu6HxppdYgte8p+rciqgT5/ucoXz8tz99Olel8ikQ3juuRc6dXLZM//7v/D738PYsd5mTjRt6rJ9rGM0ukyOge6VnAno06e7zqg1a1zNac0a99yCur/MnevG/q6NZ589NPfcC6Wl7qrQ+vXh17/2tizg0hffey/xeUrrmkyPge6FrArosWrgEyfCzp3V19+5M7P5wCa2rVvd0LCJXmofTbTc80y79FI4+mjXfn700d6WBVw7+vbtbvx1c6hcz3CBLBqcK1gDDwbtYA0c3Kn32rWR3xdtucm8f/3L1R5ffNGd/rZoUfNtlJe77cQbVjYTmjZ1A3B5XY6gYMfowoXuB89UV1YGbdv648c3XbKmhh6vBt6hQ+T3RVtuMi/YYbd7t7swJxmJ5J5nkl+CObh2/SOOsI7RaLwYAz3Tsiagx6uBT54MjRtXf61xY7fc+EPwkvsTTkhuOrcDBxLPPa+LRFwt3TpGD+XlGOiZlDUBPV4NfNQomDrVjVMt4u6nTvVPTa6uq6x0gaa42HUmLlxY88Gk5s51nZBjxqSliDmhf39YsSL60MF1lZdjoGdS1gT0RGrgo0a5iXgrK929BXP/WLrUdYoWF7urNvPyXPNJTQRzz88/Py1FzAl2gVFkdaFDFLKoUzQYnCdOdM0sHTq4YG5BOzsEmwH694djjoGzz4Ynn4Q770xsGNNNm1zu+RVXeJd7ng369nV9DP/4hxtGOBt8+KE7a9u7N7n3n3iim6gk1t9FWZkb+iEXx0APlTUBHVzwTjaAT59uPwZeWrgQ2rRxl12D+we+7DJ3+fzQofHf/6tfufFbrr46rcXMeo0auXHen3/ejTCZlwXn4A895M6okznz2rkTXnjBXeB17bXR1wuOgX5YVkW8JKiqJ7e+fftqpjz9tGrjxqrukiN3a9zYLTeZ0bWr6n/918Hnu3aptmyp+oMfxH/v0qWq+fmq11yTvvLlkunT3d/42297XZL4KipUGzVSvfLK5N5fWal61lmqhx+uunlz9HVatVL9yU+SL6efAIs0SlzNgt/v2rOLjry1eTMsX36wfRfc6e/Ika52VVER+/033uhyvidNSm85c8VFF0Hz5sllEmXazJmwa1fyV/2KuBEuKyqiX637xRe5PQZ6qDoR0O2iI28FO+hCAzq4f+J4Oelz58Lf/+7m6WzTJm1FzCmNG7vmrJkz3ZWjfjZtmhtD/uSTk99Gz57w4x/DI49EzpyqKx2iUEcCul105K2FC13bZVFR9eUnnRQ7J/3AATelW6dO8LOfpb2YOaW01M2oNHOm1yWJbsUKWLAg+oxTNXHnne6s7+abD30t18dAD1UnArpddOSthQtd7Sj8OxCJnZP+17/CJ5/AvfdCgwaZKGnu6N8fjjvO380uTz7pOm1Hj679to48En7xC5cJNW9e9ddyfQz0UHUioNtFR97Zv9/N+xmcyDhctJz0bdtcM8upp7pBsEzNBH8s33nHDRnrN5WV7jsfOhTatUvNNq+7zp1133CD235Qro+BHiqhgC4iJSKyXERWiMgtUdYZJCJlIrJERN5JbTFrzy468sbHH7sO6PD286DQnPTQYV9/+1v46it/DMKVrUaPdsfuySe9Lsmh5s1zfVipHAK5USO4+27497/dEBHgLmZbudICehURyQceBc4BugMjRaR72DotgT8AF6hqD2B46otqslHoBUXRlJa62djfess9X7vWzf4zapSbicck59hjYcgQVxMOrbH6wbRpbrTNCy9M7XZHjHB/M7/4hetDqAtjoIdKpIbeD1ihqqtUdS8wAwj/Gn4AvKCqawFU1UaSMIBrHz/mmNgd0BdcAC1bHmzv/cUv3P1vfpPu0uW+0lJ3Rjp/vtclOWjrVtdZO2KEq1WnUl6eO6vbsMGlM9alDBdILKC3A9aFPF8fWBbqeOBwEZknIh+KyI8ibUhErhCRRSKyaNOmTcmV2GSVhQtdc0usZpPQnPS5c91VvT//uWUhpYIfc9Jrm3sez6mnwvDhrjP973/P/THQQyUS0CP9K2rY88OAvsB5wNnAbSJyyKgJqjpVVYtUtaht27Y1LqzJLl9+6WqHsZpbgoI56Zdc4jIWIqWfmZrzY056KnLP47nnHtchP2dO7o+BHiqRkQ3WA8eGPG8PbIiwzjequgPYISLzgV5ADQdIrXs+/dSdIu7ZE/l1ETfD/FlnZbZcsTz5pKvxxBuDJdh+Hq1DNFQwJ7283B2PupBilimlpfCnP7mgHqtWvGOHm05vQ/h/d4hevWDChOTHiAnmnt99d3qDbOfObmyXKVPqTnMLEH8sF1zQXwV0AuoDi4EeYeucALwZWLcx8ClwYqztZnIsF7966y3V5s3d7Xvfi3xr21Y1L0916lSvS+t8/LErT8uWqt98E3vdCRNU69dX3b07sW3/7W+qw4ap7t9f+3KagyorVY87TnXgwOjrfPWV6kknue822t9ip05ujJjhw91YPMm47Ta3j/Xrk3t/TXz3nRvnZeHC9O8rk4gxlktCA2kB5+Jq2yuBiYFl44BxIevcCCwNBPPr4m2zrgf0Z55RrVdPtUcP1bVro6+3bZvqOee4b+r2290/p1cqK1WHDnU/QHl5quPHx16/uNjdjPcmT3Z/QytXHvraf/6j2qWLGyTrpZdib+f++912Tj9ddcuWmpXhwAHVDh1Uzz67Zu8z1dU6oKfjVpcD+n331eyfYu9e1csvd+8ZO9Y998Ls2a4MDz7oRsc77DDVZcsir7t7t6udT5iQ2TKayNauVRVRnTSp+vJ//cudBbZpo/ree4lt65ln3HfbvXvsyki4N990fz/PPJP4e8yhLKD7xIEDqtddl9xpa2WlO10FV2Pfti195Yxk3z7VE05wp+579qhu3KjarJnqBRdEXv/dd11Z/+//MltOE93QoaoFBe7vUFX15ZfdMNKdO6t+9lnNtvX226otWqgec4zq4sWJvWf0aPeenTtrti9TnQV0H9i1S/W//9sd8euuO/hPVVN//KNr7igqcu2emfKHP7iyv/jiwWV33+2WvfnmoesHT803bMhYEU0cwXHS581zfTJ5eap9+7of52R8/LFqu3auCe6tt2KvW9txz81BFtAzYM8e1e3bI982bnQdUuACXW299JL75+jcWXXJkuj7TbbjKtx337lT8oEDq7fh79ql2rGjamHhoR2Zw4a52qDxjx07XPAtKEjdmd7ata4fqF49N2FMtL/Fxx5z+3z33dR8lrrMAnqarVih2qCBVpsRKfxWr15q2w7fe88F2Vj7FElNk8dNN7ltffjhoa8984zb1+OPH1xWWelOxROZjchk1k9+4r6vyy9PXV/Mli2uPyjW3yKoHn+8t536uSJWQBf3euYVFRXpokWLPNl3qk2f7kYNvPlmNyt9JGecceh44LX1+efu6spo43RMmQKDB7sJdGuzj27d3JWcka42VHV55mvWuCFwmzZ1Y7F07Ai//z1cc03y+zapt2WLGwbgwgtTmwe+e7cbM2br1ujrDB4Mffqkbp91lYh8qKoRo0muT5maEeXlbub6O+/M7Iz0nTq5S+SjWboUXnrJjWKYn5/cPm691b032tjxIu5CoOJiN3bGHXe4y/0hsQuKTGa1auWGA0i1hg3hyitTv11TM3ViPPR0Ky+HLl0yG8wTUVLiamTJngi9+y48+yzcdFPsMav793eXl997r5u/ceFCd8n597+f3H6NMcmxgJ4C5eXusnW/GTLEXaI9Z07N36sK11/vLvG/8cb4699zj2v6mTjR/RD06+emnTPGZI4F9Fratw/+8x9/BvTWrd0YKckE9GefhX/9yw1h26RJ/PULCtyMMU88AR99ZM0txnjBAnotrVzpRnXr3j3+ul4oKXFTwG3enPh7du+GW26B3r3dwGCJuvVWN1RpZWViIywaY1LLAnotlZe7ez/W0MEF9MpKeOONxN8zY4bLWrn33pqNqteihcusadXKjUltjMksC+i1FAzo3bp5W45oTjoJDj+8Zs0u06a5GeMHD675/saMgU2b3D6NMZllAb2Wli51czc2bep1SSLL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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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a9cuevfuzbJlyzjjjDOYM2cOLVq0YMSIETz++ONlXl95KaGLSIky1W61detWWrRoAcCjjz6a8uV37tyZzz//nJUrVwLwl7/8Je48Z5xxBlMjjQezZ8+madOmNGzYkM8++4y8vDxuuukmCgoKWLZsGatWraJ58+ZcccUV/PSnP2XhwoUpfw+lUUIXkRINHw6TJ0ObNmAW/k6enP6y54033sjNN99M3759KSwsTPny69aty3333cc555zDaaedxtFHH02jRo1izjNx4kTmz59Ply5dGD9+PI899hgAd911FyeffDJdu3albt269O/fn9mzZx9oJH3uuee45pprUv4eSpOxe4oWFBS4bnAhUrGWLl3KCSeckOkwMm7Hjh3Ur18fd+fqq6+mQ4cOjBs3LtNhHaakz8vMFrh7QUnT6whdRKqcBx98kPz8fE466SS2bt3KlVdememQUiJuLxczqwPMAWpHpn/W3ScUm8aA/wEGADuBke5ecYUjEZEyGDduXKU8Ik9WIt0W9wBnuvsOM6sJzDOzV9z9vahp+gMdIo9TgPsjf0VEpILELbl4sCPysmbkUbzwPhh4PDLte0BjMzs2taGKiEgsCdXQzay6mS0CvgZed/e/F5ukBfBF1Os1kWHFlzPazOab2fz169eXM2QRESlJQgnd3QvdPR9oCfQys5OLTVLShXsP6z7j7pPdvcDdC5o1a1bmYEVEpHRl6uXi7luA2cA5xUatAVpFvW4JrE0mMBHJPf369eO11147ZNhdd93FVVddFXOeoi7OAwYMYMuWLYdNM3HiRO64446Y654+fToff/zxgde33XYbM2fOLEP0JatMl9mNm9DNrJmZNY48rwucDSwrNtkLwCUW9Aa2uvu6VAcrItlt2LBhTJs27ZBh06ZNS+gCWRCukti4ceNyrbt4Qv/Nb37D2WefXa5lVVaJHKEfC8wys8XAPwk19BfNbIyZjYlM8zLwObACeBAofXcrIlXWBRdcwIsvvsiePXsAWLlyJWvXruW0005j7NixFBQUcNJJJzFhwoQS52/bti0bNmwAYNKkSXTq1Imzzz77wCV2IfQx79mzJ127duX8889n586dvPPOO7zwwgvccMMN5Ofn89lnnzFy5EieffZZAN544w26detGXl4eo0aNOhBf27ZtmTBhAt27dycvL49ly4ofyx4q05fZjdtt0d0XA91KGP5A1HMHrk46GhGpMNdeC4sWpXaZ+flw112lj2/SpAm9evXi1VdfZfDgwUybNo2LLroIM2PSpEkcddRRFBYWctZZZ7F48WK6dOlS4nIWLFjAtGnTeP/999m3bx/du3enR48eAAwdOpQrrrgCgF/+8pc89NBD/OxnP+Pcc89l0KBBXHDBBYcsa/fu3YwcOZI33niDjh07cskll3D//fdz7bXXAtC0aVMWLlzIfffdxx133MGUKVNKfX+ZvsyuzhQVkQoVXXaJLrc888wzdO/enW7durFkyZJDyiPFzZ07l/POO4969erRsGFDzj333APjPvroI04//XTy8vKYOnUqS5YsiRnP8uXLadeuHR07dgTg0ksvZc6cOQfGDx06FIAePXocuKBXaebNm8eIESOAki+ze/fdd7NlyxZq1KhBz549eeSRR5g4cSIffvghDRo0iLnsRGTV9dBFJHViHUmn05AhQ7juuutYuHAhu3btonv37vzrX//ijjvu4J///CdHHnkkI0eOLPWyuUXCCeqHGzlyJNOnT6dr1648+uijzJ49O+Zy4l3PqugSvKVdojfesoousztw4EBefvllevfuzcyZMw9cZvell15ixIgR3HDDDVxyySUxlx+PjtBFpELVr1+ffv36MWrUqANH59u2beOII46gUaNGfPXVV7zyyisxl3HGGWfw17/+lV27drF9+3b+9re/HRi3fft2jj32WPbu3XvgkrcADRo0YPv27Yctq3PnzqxcuZIVK1YA8MQTT/Cd73ynXO8t05fZ1RG6iFS4YcOGMXTo0AOll65du9KtWzdOOukk2rdvT9++fWPO3717dy666CLy8/Np06YNp59++oFxt99+O6eccgpt2rQhLy/vQBK/+OKLueKKK7j77rsPNIYC1KlTh0ceeYQLL7yQffv20bNnT8aMGXPYOhMxceJELrvsMrp06UK9evUOuczurFmzqF69OieeeCL9+/dn2rRp/PGPf6RmzZrUr18/JTfC0OVzRaoQXT43u+jyuSIiVZQSuohIjlBCF6liMlVmlbIpz+ekhC5ShdSpU4eNGzcqqVdy7s7GjRupU6dOmeZTLxeRKqRly5asWbMGXb668qtTpw4tW7Ys0zxK6CJVSM2aNWnXrl2mw5A0UclFRCRHKKGLiOQIJXQRkRyhhC4ikiOU0EVEcoQSuohIjlBC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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "acc = history.history['accuracy']\n",
    "val_acc = history.history['val_accuracy']\n",
    "loss = history.history['loss']\n",
    "val_loss = history.history['val_loss']\n",
    "\n",
    "epochs = range(len(acc))\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.figure()\n",
    "\n",
    "plt.plot(epochs, loss, 'bo', label='Training loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
    "plt.title('Training and validation loss')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
